#include "worker.h" // tidArr_t
#include "taskQueue.h"
#include "tcpInit.h"
#include "epoll.h"
#include "head.h" //threadPoot_t
int main(int argc, char *argv[])
{
    // ./server 192.168.72.128 12345 3
    ARGS_CHECK(argc,4);
    // 子线程的创建
    threadPool_t threadPool; // 所有线程池相关的数据都放在threadPool变量里面
    tidArrInit(&threadPool.tidArr,atoi(argv[3]));//初始化子线程的tid
    makeWorker(&threadPool);//创建子线程
    // 初始化一下 任务队列、锁、条件变量
    initTaskQueue(&threadPool.taskQueue);
    pthread_mutex_init(&threadPool.mutex,NULL);
    pthread_cond_init(&threadPool.cond,NULL);
    // tcp服务端的准备工作
    int sockfd = tcpInit(argv[1],argv[2]);
    // epoll相关处理
    int epfd = epoll_create(1);
    epollAdd(epfd,sockfd);
    while(1){
        struct epoll_event readyset[1024];
        int readynum = epoll_wait(epfd,readyset,1024,-1);
        for(int i = 0; i < readynum; ++i){
            if(readyset[i].data.fd == sockfd){
                int netfd = accept(sockfd,NULL,NULL);
                // 把netfd发给子线程
                printf("Main thread get task!\n");
                pthread_mutex_lock(&threadPool.mutex);//加锁 保护任务队列
                enQueue(&threadPool.taskQueue,netfd); //入队
                printf("I am main. I send a task, netfd = %d\n", netfd);
                pthread_cond_signal(&threadPool.cond);//唤醒子线程
                pthread_mutex_unlock(&threadPool.mutex);//解锁
            }
        }
    }
    return 0;
}

